package tests;

import common.AutoTestUtil;
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

import java.io.IOException;
import java.time.Duration;

public class PageEdit extends AutoTestUtil {
    /**
     * 编辑页面成功
     */
    public void successEdit() throws NoSuchMethodException, IOException, InterruptedException {

        String title = "UI自动化测试";
        //添加标题
        driver.findElement(By.cssSelector("#article_post_title")).sendKeys(title);

        //测试markdown是否能够进行编辑以及发帖的操作
        WebElement element = driver.findElement(By.cssSelector("#edit-article > div.CodeMirror.cm-s-default.CodeMirror-wrap.CodeMirror-empty > div.CodeMirror-scroll > div.CodeMirror-sizer > div > div > div > div.CodeMirror-code > div > pre"));

        //进行操作,模拟鼠标的操作
        Actions actions = new Actions(driver);
        actions.doubleClick(element).perform();
        /*//删除数据
        actions.keyDown(element,Keys.DELETE).perform();*/
        //再次进行输入操作
        actions.moveToElement(element).sendKeys("###UI自动化测试\n " + "UI 自动化测试是通过编写自动化脚本，来模拟用户与软件界面的交互操作，以验证软件界面的功能和稳定性。正如你所说，UI 自动化主要分为 Web 自动化和客户端自动化两类，以下是它们的详细介绍：\n" +
                "Web 自动化\n" +
                "测试对象：主要针对基于 Web 浏览器的应用程序，包括各种网站、Web 应用系统等。例如，电商网站、企业办公系统的 Web 版等。\n" +
                "技术工具：常用的工具如 Selenium，它可以通过各种浏览器驱动来操作浏览器，模拟用户的点击、输入、选择等操作，还能与多种编程语言（如 Java、Python、C# 等）结合使用。另外，还有 Puppeteer，它是基于 Node.js 的工具，能方便地进行网页截图、生成 PDF 等操作，对于测试网页的视觉效果和打印功能很有帮助。").perform();

        String str = this.getClass().getMethod("successEdit").getName();
        getScreen(str);

        //点击发布
        //注意这里的发布操作存在两个，所以得明确那个标签
        driver.findElement(By.cssSelector("#bit-forum-content > div.page-body > div > div > div.card-footer.bg-transparent.mt-auto > div>#article_post_submit")).click();
        getScreen(str);

        //判断是否发送成功

        try {
            String targetTitle = driver.findElement(By.cssSelector("#artical-items-body > div:nth-child(1) > div > div.col > div.text-truncate > a > strong")).getText();
            if(title.equals(targetTitle)){
                System.out.println("文章发送成功！！！");
            }
        }catch (Exception e){
            System.out.println("方法successEdit出现异常：" + e);
        }
    }

    /**
     * 编辑页失败与成功编辑
     */
    public void AllEdit() throws InterruptedException, NoSuchMethodException, IOException {

        //已经进入了博客界面，直接查找元素即可
        WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(2));
        //是否可进行点击
        wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#bit-forum-content > div.page-header.d-print-none > div > div > div.col-auto.ms-auto.d-print-none > div > a.btn.btn-primary.d-none.d-sm-inline-block.article_post")));
        driver.findElement(By.cssSelector("#bit-forum-content > div.page-header.d-print-none > div > div > div.col-auto.ms-auto.d-print-none > div > a.btn.btn-primary.d-none.d-sm-inline-block.article_post")).click();

        //判断是否进入编辑页面
        try {
            driver.findElement(By.cssSelector("#bit-forum-content > div.page-header.d-print-none > div > div > div > h2"));
        }catch (Exception e){
            System.out.println("successDetail方法出现异常：" + e);
        }
        //测试不输入标题以及文章，以及不输入标题，输入文章

        //啥都不输入
        WebElement element = driver.findElement(By.cssSelector("#bit-forum-content > div.page-body > div > div > div.card-footer.bg-transparent.mt-auto > div>#article_post_submit"));
        //绕过前端交互检测，直接触发点击事件
        JavascriptExecutor executor = (JavascriptExecutor) driver;
        executor.executeScript("arguments[0].click();", element);

        Thread.sleep(2000);
        //继续只输入内容，不输入标题
        element = driver.findElement(By.cssSelector("#edit-article > div.CodeMirror.cm-s-default.CodeMirror-wrap.CodeMirror-empty > div.CodeMirror-scroll > div.CodeMirror-sizer > div > div > div > div.CodeMirror-code > div > pre"));
        Actions actions = new Actions(driver);
        actions.doubleClick(element);

        actions.moveToElement(element).sendKeys("###UI自动化测试\n " + "UI 自动化测试是通过编写自动化脚本，来模拟用户与软件界面的交互操作，以验证软件界面的功能和稳定性。正如你所说，UI 自动化主要分为 Web 自动化和客户端自动化两类，以下是它们的详细介绍：\n" +
                "Web 自动化\n" +
                "测试对象：主要针对基于 Web 浏览器的应用程序，包括各种网站、Web 应用系统等。例如，电商网站、企业办公系统的 Web 版等。\n" +
                "技术工具：常用的工具如 Selenium，它可以通过各种浏览器驱动来操作浏览器，模拟用户的点击、输入、选择等操作，还能与多种编程语言（如 Java、Python、C# 等）结合使用。另外，还有 Puppeteer，它是基于 Node.js 的工具，能方便地进行网页截图、生成 PDF 等操作，对于测试网页的视觉效果和打印功能很有帮助。").perform();
        //进行提交操作
        // 绕过前端交互检测，直接触发点击事件
        element = driver.findElement(By.cssSelector("#bit-forum-content > div.page-body > div > div > div.card-footer.bg-transparent.mt-auto > div>#article_post_submit"));
        executor.executeScript("arguments[0].click();", element);

        //此时进行标题的输入
        String title = "UI自动化测试";
        //添加标题
        driver.findElement(By.cssSelector("#article_post_title")).sendKeys(title);

        //点击发布
        //注意这里的发布操作存在两个，所以得明确那个标签
        // 绕过前端交互检测，直接触发点击事件
        element = driver.findElement(By.cssSelector("#bit-forum-content > div.page-body > div > div > div.card-footer.bg-transparent.mt-auto > div>#article_post_submit"));
        executor.executeScript("arguments[0].click();", element);

        String str = this.getClass().getMethod("successEdit").getName();
        getScreen(str);

        //判断是否发送成功

        try {
            String targetTitle = driver.findElement(By.cssSelector("#artical-items-body > div:nth-child(1) > div > div.col > div.text-truncate > a > strong")).getText();
            if(title.equals(targetTitle)){
                System.out.println("文章发送成功！！！");
            }
        }catch (Exception e){
            System.out.println("方法successEdit出现异常：" + e);
        }

    }
}
